package com.woniu.controller;

import com.woniu.common.CommonResult;
import com.woniu.common.CookieUtil;
import com.woniu.common.QiniuUploadUtil;
import com.woniu.entity.*;
import com.woniu.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;

import javax.annotation.Resource;
import javax.sound.midi.Soundbank;
import java.io.IOException;
import java.util.*;

/**
 * 二手商品表(UsedProduct)表控制层
 *
 * @author makejava
 * @since 2020-03-23 09:48:25
 */
@Controller
@RequestMapping("/usedProduct")
public class UsedProductController {

    @Resource
    UsedProductService usedProductService;

    @Resource
    PersonUserService personUserService;

    @Resource
    AreainfoService areainfoService;

    @Resource
    UsedProductTypeService usedProductTypeService;

    @Resource
    UsedProductImgsService usedProductImgsService;

    @Resource
    UsedProductOrderService usedProductOrderService;

    @Resource
    CookieUtil cookieUtil;

    @Autowired
    RedisTemplate redisTemplate;


    /**
     * 功能描述: 查询已付款的商品
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/4/2 17:37
     */
    @GetMapping("/yespayProduct")
    public @ResponseBody CommonResult yespayProduct(){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        PersonUser personUser = personUserService.findIdByName(name);
        //已付款（未付款 0 ，已付款 1）
        Integer orderStatus = 1;
        //二手市场商品
        Integer orderType = 1;
        ArrayList<Integer> productIdList = usedProductOrderService.findProductIdByPayStatus(personUser.getId(), orderStatus, orderType);
        if (productIdList == null){
            return CommonResult.failed("当前暂无数据");
        }
        //查询商品数据
        ArrayList<UsedProduct> usedProducts = new ArrayList<>();
        for (Integer id:productIdList) {
            UsedProduct usedProduct = usedProductService.queryById(id);
            usedProducts.add(usedProduct);
        }
        return CommonResult.success("查询成功",usedProducts);
    }

    /**
     * 功能描述: 查询未付款的商品
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/31 1:06
     */
    @GetMapping("/nopayProduct")
    public @ResponseBody CommonResult nopayProduct(){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        PersonUser personUser = personUserService.findIdByName(name);
        //未付款
        Integer orderStatus = 0;
        //二手市场商品
        Integer orderType = 1;
        ArrayList<Integer> productIdList = usedProductOrderService.findProductIdByPayStatus(personUser.getId(), orderStatus, orderType);
        if (productIdList == null){
            return CommonResult.failed("当前暂无数据");
        }
        //查询商品数据
        ArrayList<UsedProduct> usedProducts = new ArrayList<>();
        for (Integer id:productIdList) {
            UsedProduct usedProduct = usedProductService.queryById(id);
            usedProducts.add(usedProduct);
        }
        return CommonResult.success("查询成功",usedProducts);



    }

    /**
     * 功能描述: 更新商品信息
     * @Param: [usedProduct]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/31 1:06
     */
    @PutMapping("/updateProduct")
    public @ResponseBody CommonResult updateProduct(UsedProduct usedProduct){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        try {
            usedProduct.setLastTime(new Date());
            usedProductService.update(usedProduct);
            //将图片链接保存到图片表中，商品id
            UsedProductImgs productImgs = new UsedProductImgs();
            productImgs.setImgUrl((String) redisTemplate.opsForValue().get(name+"img"));
            productImgs.setProductId(usedProduct.getId());
            usedProductImgsService.insert(productImgs);
            redisTemplate.delete(name+"img");
            return CommonResult.success("更新成功");
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("更新失败");
        }
    }

    /**
     * 功能描述: 根据商品Id查询商品所有信息
     * @Param: [productId]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/28 21:52
     */
    @GetMapping("/findAllByProductId/{productId}")
    public @ResponseBody CommonResult findAllProductByProductId(@PathVariable("productId")Integer productId){
        try {
            UsedProduct usedProduct = usedProductService.queryById(productId);
            return CommonResult.success(usedProduct);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("查询失败");
        }
    }

    /**
     * 功能描述: 删除商品
     * @Param: [productId]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/28 17:05
     */
    @DeleteMapping("/deleteProduct/{productId}")
    public @ResponseBody CommonResult deleteProduct(@PathVariable("productId") Integer productId){
        try {
            usedProductService.deleteById(productId);
            usedProductImgsService.deleteImgsByProductId(productId);
            return CommonResult.success("商品删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("商品删除失败");
        }
    }

    /**
     * 功能描述: 商品上架
     * @Param: [productId]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/29 1:41
     */
    @PutMapping("/productOnOffer/{productId}")
    public @ResponseBody CommonResult productOnOffer(@PathVariable("productId") Integer productId){
        //先根据Id查询商品
        UsedProduct usedProduct = usedProductService.queryById(productId);
        //商品状态为下架时，修改为上架
        if (usedProduct.getStatus()==2){
            usedProduct.setStatus(0);
            try {
                usedProductService.update(usedProduct);
                return CommonResult.success("商品上架成功");
            } catch (Exception e) {
                e.printStackTrace();
                return CommonResult.failed("商品上架失败");
            }
        }
        return CommonResult.failed("商品上架失败");
    }

    /**
     * 功能描述: 商品下架
     * @Param: [productId] 下架商品的Id
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/28 16:38
     */
    @PutMapping("/productSoldOut/{productId}")
    public @ResponseBody CommonResult productSoldOut(@PathVariable("productId") Integer productId){
        //先根据Id查询商品当前状态1
        UsedProduct usedProduct1 = usedProductService.queryById(productId);
        if (usedProduct1.getStatus() == 0){
            UsedProduct usedProduct = new UsedProduct();
            usedProduct.setStatus(2);
            usedProduct.setId(productId);
            try {
                usedProductService.update(usedProduct);
                return CommonResult.success("商品下架成功！");
            } catch (Exception e) {
                e.printStackTrace();
                return CommonResult.failed("商品下架失败！");
            }
        } //0:正在出售；1：已售出；2：用户下架；3：审核中；4.审核不合格
         else if (usedProduct1.getStatus() == 1){
                return CommonResult.failed("商品已售出！");
         }else if (usedProduct1.getStatus() == 2){
            return CommonResult.failed("该商品已下架，不能二次下架！");
        }
         return CommonResult.failed("该商品不能下架");

    }

    /**
     * 功能描述: 当前用户下架的商品
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/29 1:34
     */
    @GetMapping("/findSoldOutProductByUserId")
    public @ResponseBody CommonResult findSoldOutProductByUserId(){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        try {
            PersonUser personUser = personUserService.findIdByName(name);
            List<UsedProduct> products = usedProductService.findSoldOutProductByUserId(personUser.getId());
            return CommonResult.success(products);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("查询失败");
        }

    }

    /**
     * 功能描述: 当前用户已出售的商品
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/29 2:01
     */
    @GetMapping("/tradeproduct")
    public @ResponseBody CommonResult tradeproduct(){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        try {
            PersonUser personUser = personUserService.findIdByName(name);
            List<UsedProduct> products = usedProductService.findTradeProductByUserId(personUser.getId());
            return CommonResult.success(products);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("查询失败");
        }

    }

    /**
     * 功能描述: 当前用户正在出售的商品
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/29 1:33
     */
    @GetMapping("/findOnOfferProductByUserId")
    public @ResponseBody CommonResult findOnOfferProductByUserId(){
          //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        try {
            PersonUser personUser = personUserService.findIdByName(name);
            List<UsedProduct> products = usedProductService.findOnOfferProductByUserId(personUser.getId());
            return CommonResult.success(products);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("查询失败");
        }

    }

    /**
     * 功能描述: 根据用户Id查询所有商品
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/28 15:48
     */
    @GetMapping("/findAllProductByUserId")
    public @ResponseBody CommonResult findAllProductByUserId(){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        try {
            PersonUser personUser = personUserService.findIdByName(name);
            List<UsedProduct> products = usedProductService.findAllProductByUserId(personUser.getId());
            return CommonResult.success(products);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("查询失败");
        }

    }

    /**
     * 功能描述: 根据商品Id，查询商品的详细信息
     * @Param: [productId]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/26 9:55
     */
    @GetMapping("/findAllProduct/{productId}")
    public @ResponseBody CommonResult findAllByProductId(@PathVariable("productId")Integer productId){
        try {
            //查询商品信息
            UsedProduct usedProduct = usedProductService.queryById(productId);
            //查询商品图片
            List<UsedProductImgs> imgs = usedProductImgsService.findImgsByProductId(productId);
            HashMap map = new HashMap<>();
            map.put("product",usedProduct);
            map.put("imgs",imgs);
            return CommonResult.success("商品查询成功",map);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("当前商品已售出");
        }
    }

    /**
     * 功能描述: 图片上传到七牛云
     * @Param: [imgBase]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/28 13:42
     */
    @PostMapping("/upload")
    public @ResponseBody CommonResult upload(String imgBase){
        byte[] b1 = null;
        BASE64Decoder decoder = new BASE64Decoder();
        try{
            if (imgBase.indexOf("data:image/jpeg;base64,") != -1) {
                b1 = decoder.decodeBuffer(imgBase.replaceAll("data:image/jpeg;base64,", ""));
            } else {
                if (imgBase.indexOf("data:image/png;base64,") != -1) {
                    b1 = decoder.decodeBuffer(imgBase.replaceAll("data:image/png;base64,", ""));
                } else {
                    b1 = decoder.decodeBuffer(imgBase.replaceAll("data:image/jpg;base64,", ""));
                }
            }
            for (int i = 0; i < b1.length; ++i) {
                if (b1[i] < 0) {// 调整异常数据
                    b1[i] += 256;
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        //添加图片url；
        String name = UUID.randomUUID().toString().replace("_", "");
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String userName = "admin";
        try {
            String imgUrl = new QiniuUploadUtil().upload(name, b1);
            //图片链接else
            System.out.println(imgUrl);
            //将图片链接存入redis中
            redisTemplate.opsForValue().set(userName+"img",imgUrl);
            return CommonResult.success("1");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return CommonResult.success("0");
    }


    /**
     * 功能描述: 保存前端传过来的二手商品数据
     * @Param: [usedProduct]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/25 20:09
     */
    @PostMapping("/saveProduct")
    public @ResponseBody CommonResult saveProduct(UsedProduct usedProduct){
        //获取当前登录的用户的用户名
//        String name = cookieUtil.getName();
        String name = "admin";
        //查询用户Id
        PersonUser personUser = personUserService.findIdByName(name);
        usedProduct.setUserId(personUser.getId());
        usedProduct.setCommunityId(personUser.getPlotId());
        //设置状态为正在出售(0:正在出售；1：已售出；2：用户下架；3：审核中；4.审核不合格)
        usedProduct.setStatus(0);
        //根据typeId查询name
        String typeName = usedProductTypeService.findNameById(usedProduct.getProductTypeId());
        usedProduct.setProductTypeName(typeName);
        //默认数量为1
        usedProduct.setNumber(1);
        //商品上架时间
        usedProduct.setCreatTime(new Date());
        //商品取件方式(0:自取，1:邮寄)
        //将商品数据存入数据库
        try {
            UsedProduct usedProduct1 = usedProductService.insert(usedProduct);
            //将图片链接保存到图片表中，商品id
            UsedProductImgs productImgs = new UsedProductImgs();
            productImgs.setImgUrl((String) redisTemplate.opsForValue().get(name+"img"));
            productImgs.setProductId(usedProduct1.getId());
            usedProductImgsService.insert(productImgs);
            redisTemplate.delete(name+"img");
            return CommonResult.success(usedProduct1.getId());
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("商品发布失败");
        }
    }

    /**
     * 功能描述: 根据商品类型Id查询所有商品
     * @Param: [typeId]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/25 16:43
     */
    @GetMapping("/findAllByTypeId/{typeId}")
    public @ResponseBody CommonResult findAllByTypeId(@PathVariable("typeId")Integer typeId){
        try {
            List<UsedProduct> products = usedProductService.findAllByTypeId(typeId);
            if (products == null){
                //当返回值为空时，状态码400，返回消息
                return CommonResult.valetateFailed("该分类暂无商品");
            }else{
                return CommonResult.success(products);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("查询失败！");
        }

    }

    /**
     * 功能描述: 获取二手商品的类型，返回给前端页面进行加载
     * @Param: []
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/24 15:50
     */
    @GetMapping("/findAllProductType")
    public @ResponseBody CommonResult findAllProductType(){
        //查询所有二手商品类型信息
        List<UsedProductType> types = null;
        try {
            types = usedProductTypeService.findAll();
            return CommonResult.success(types);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed("获取信息失败！");
        }

    }

    /**
     * 功能描述: 根据UserId查询所属小区名称
     * @Param: [userId]
     * @Return: com.woniu.common.CommonResult
     * @Author: yanghan
     * @Date: 2020/3/24 16:02
     */
    @GetMapping("/findAreainfo")
    public @ResponseBody CommonResult findAreainfo(){
        String name = "admin";
        //查询用户Id
        PersonUser personUser = personUserService.findIdByName(name);
        Areainfo areainfo = null;
        try {
            //根据用户Id查询所属小区
            Integer plotId = personUserService.findPlotIdByUserId(personUser.getId());
            //查询小区信息
            areainfo = areainfoService.findAllByPlotId(plotId);
//            return CommonResult.success(areainfo);
        } catch (Exception e) {
            e.printStackTrace();
            //return CommonResult.failed("获取信息失败！");
        }
        return CommonResult.success(areainfo);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("/selectOne")
    public UsedProduct selectOne(Integer id) {
        return this.usedProductService.queryById(id);
    }


}